# Esta clase permite visualizar la perfomance por usuario o por equipo de los Account Managers.
class ReportesController < ApplicationController

	 before_filter :ensure_login	
	 before_filter :get_mod, :only => [:new,:edit, :delete]
	 require 'gruff'
	
# Prepara el nuevo reporte para ser creado.
  def new
  	@reporte = Reporte.new
    
    respond_to do |format|
      format.html 
      format.xml  { render :xml => @reporte }
    end
  end

# Crea el nuevo reporte.
  def create
    cookies.delete :auth_token
    # protects against session fixation attacks, wreaks havoc with 
    # request forgery protection.
    # uncomment at your own risk
    # reset_session
    @reporte = Reporte.new(params[:reporte])
 
    if @reporte.fecha_desde > @reporte.fecha_hasta then
	 	 flash_error :message => "La Fecha Desde no puede ser menor a la Fecha Hasta"
	 	 render :action => 'new'
		else		  
		  @reporte.save
    	if @reporte.errors.empty?
    	  redirect_back_or_default('/reportes')
    	else        	
    	  render :action => 'new'
    	end
		end
  end

# Actualiza el reporte.
  def update
    if !Reporte.get_mod_reporte(@current_user) then
  		redirect_to('/reportes')			
		else
    
    @reporte = Reporte.find(params[:id])
    respond_to do |format|
      if @reporte.update_attributes(params[:reporte])
        flash[:notice] = 'Reporte was updated.'
        format.html { redirect_to(reportes_path) }
        format.xml  { head :ok }
      else
        format.html { render :action => "edit" }
        format.xml  { render :xml => @reporte.errors, :status => :unprocessable_entity }
      end
    end
    end
  end

# Recupera el reporte para ser mostrado en pantalla.
  def show
    @reporte = Reporte.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @reporte }
    end 
  end

# Recupera el gráfico comparativo de perfomance entre el usuario/equipo y los valores de referencia.
	def get_chart	
	resultado = params[:resultado]	
	g = Gruff::Bar.new
	g.theme = {
   :colors => %w(orange red green white red),
   :marker_color => 'black',
   :background_colors => %w(white white) }
  
  g.title = "Performance" 
  if 	params[:name] then
		g.title += ' de ' + params[:name] 
	end
  g.data("Valores Actuales", [resultado['Promedio Movimientos'].to_f,resultado['Promedio Reuniones'].to_f])
  
  @metrica = Metrica.find(:last)
  
  g.data("Referencia", [@metrica.movimientos,@metrica.reuniones])
  g.labels = {0 => 'Movimientos', 1 => 'Reuniones'}
  g.write('public/images/chart_temp.png')	
	  respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :partial => "get_chart" }
    end	
	end

# Permite obtener los datos de perfomance de un usuario.
  def get_user
 	@reporte = Reporte.find(params[:id])  	
	@cuentas = Comunicacion.find(:all,  :conditions => ['fecha >= ? AND fecha <= ? AND user_id = ? AND type = ?',@reporte.fecha_desde,@reporte.fecha_hasta,@reporte.user_id,"Venta" ] ).collect{|comunicacion|[ comunicacion.cuenta.id] }
	
	 @comunicaciones = Comunicacion.find(:all,:conditions => ['fecha >= ? AND fecha <= ? AND user_id = ?', @reporte.fecha_desde, @reporte.fecha_hasta, @reporte.user_id ] )
	
 
 	@resultado = Hash.new 
 	 
 	for comunicacion in @comunicaciones 
  	 resul = @resultado[comunicacion.type].to_i
  	 resul += 1
  	 @resultado[comunicacion.type] = resul  	 	
 	end 
 	
  if @resultado[Movimiento].to_i == 0 then
		@resultado[Movimiento] = 0
	end
	if @resultado[Reunion].to_i == 0 then
		@resultado[Reunion] = 0
	end
	if @resultado[Venta].to_i == 0 then
		@resultado[Venta] = 0
	end
 	
 	
 	if @resultado[Venta] != 0 then
 		@resultado['Promedio Movimientos'] = @resultado[Movimiento].to_f / @resultado[Venta].to_f
 		@resultado['Promedio Reuniones'] = @resultado[Reunion].to_f / @resultado[Venta].to_f
  else
  	@resultado['Promedio Movimientos'] = 0  	
  	@resultado['Promedio Reuniones'] = 0  
  end
 	 
 	@nombre_user = @reporte.user.name 
 	 
  	 respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :partial => "resultado", :locals => { :resultado => @resultado, :nombre_user => @nombre_user } }
    end	 
	end
  
  
# Permite obtener los datos del promedio de todos los usuarios de un equipo. A su vez muestra el promedio por usuario.  
  def get_equipo
  
  @reporte = Reporte.find(params[:id]) 
  @users = User.find(:all, :conditions => ['equipo_id = ?',@reporte.equipo_id]).collect(&:id)  	
 	@users_all = User.find(:all, :conditions => ['equipo_id = ?',@reporte.equipo_id]) 	 	
 	
	@cuentas = Comunicacion.find(:all,  :conditions => ['fecha >= ? AND fecha <= ? AND user_id in (?) AND type = ?',@reporte.fecha_desde,@reporte.fecha_hasta,@users,"Venta" ]).collect(&:cuenta_id) 
	 
  @comunicaciones = Comunicacion.find(:all,:order => "user_id,type", :conditions => ['cuenta_id in (?) AND fecha >= ? AND fecha <= ? AND user_id in (?)', @cuentas,@reporte.fecha_desde, @reporte.fecha_hasta, @users ] )
	
 	@res = Hash.new
 	
 	for user in @users_all
 		@resultado = Hash.new
		
 		for comunicacion in @comunicaciones 
 		 if comunicacion.user_id == user.id	
  	 		resul = @resultado[comunicacion.type].to_i
  	 		resul += 1
  	 		@resultado[comunicacion.type] = resul
  	 end  	 	
 		end
 		@res[user.name] = @resultado 
 	end	 	

	for user in @users_all
	  @resultado = Hash.new
		@resultado = @res[user.name]	
		if @resultado["Movimiento"].to_i == 0 then
			@resultado["Movimiento"] = 0
		end
		if @resultado["Reunion"].to_i == 0 then
			@resultado["Reunion"] = 0
		end
		if @resultado["Venta"].to_i == 0 then
			@resultado["Venta"] = 0
		end
					
    if @resultado["Venta"] == 0 then
      @resultado['Promedio Movimientos'] = 0    	
    	@resultado['Promedio Reuniones'] = 0
    else    
 		  @resultado["Promedio Movimientos"] = @resultado["Movimiento"].to_f / @resultado["Venta"].to_f  		  
 		  @resultado["Promedio Reuniones"] = @resultado["Reunion"].to_f / @resultado["Venta"].to_f 
    end       
    @res[user.name] = @resultado    
  end
		
	@promedio = Hash.new
	
	total_movimientos = 0.0
	total_reuniones = 0.0
	
	@res.each do |key, value|
		@parcial = value
		total_movimientos += @parcial['Promedio Movimientos'].to_f
		total_reuniones += @parcial['Promedio Reuniones'].to_f	
	end
	
	@promedio['Promedio Movimientos'] = total_movimientos / @res.size.to_f
	@promedio['Promedio Reuniones'] = total_reuniones / @res.size.to_f	
		
	@nombre_equipo = @reporte.equipo.nombre
		
  respond_to do |format|
     format.html # index.html.erb
     format.xml  { render :partial => "resultado", :locals => { :res => @res, :promedio => @promedio, :nombre_equipo => @nombre_equipo } }
  end	 
	
  end


# Recupera el reporte que va a ser editado.
  def edit
    @reporte = Reporte.find(params[:id])
  end

# Recupera todos los reportes por usuario y por equipo para ser mostrados en pantalla.
  def index
    @reporte_usuarios = Reporte.search_usuarios_all(params[:search],params[:user_page])
		@reporte_equipos = Reporte.search_equipos_all(params[:search],params[:equipo_page])

    respond_to do |format|
     format.html # index.html.erb
      format.xml  { render :xml => @reporte }
    end
  end

  
# Elimina el reporte.
  def destroy
     
  
    @reporte = Reporte.find(params[:id])
    @reporte.destroy

    respond_to do |format|
      format.html { redirect_to(reportes_path) }
      format.xml  { head :ok }
    end
  end
  
  
end
